package com.qzsoft.system.modules.zhjdsysdept.controller;

import com.qzsoft.system.modules.zhjdsysdept.dto.ZhjdSysDeptTreeDto;
import com.qzsoft.system.modules.zhjdsysdept.entity.ZhjdSysDeptEntity;
import com.qzsoft.system.modules.zhjdsysdept.group.SysBaseAddGroup;
import com.qzsoft.system.modules.zhjdsysdept.group.SysBaseUpdateGroup;
import com.qzsoft.system.modules.zhjdsysdept.service.ZhjdSysDeptService;
import com.qzsoft.system.modules.zhjdsysdept.utils.ZhjdSysDeptConstants;
import com.qzsoft.zhjd.common.enums.BizCode;
import com.qzsoft.zhjd.common.utils.ResultUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qzsoft.jeemis.common.utils.Result;
import com.qzsoft.jeemis.common.validator.ValidatorUtils;
import com.qzsoft.jeemis.common.validator.group.AddGroup;
import com.qzsoft.jeemis.common.validator.group.UpdateGroup;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

/**
 * @ClassName ZhjdSysDeptController
 * @Description 机构管理
 * @author linhuawei
 * @since 2021-12-01
 */
@RestController
@RequestMapping("/api/zhjdSysDept")
public class ZhjdSysDeptController {

    @Resource
    private ZhjdSysDeptService zhjdSysDeptService;

    /**
     * @Title tree
     * @Description 不包含养护基地的机构树
     * @return 不包含养护基地的机构树
     */
    @GetMapping("/treeAll")
    public Result<List<ZhjdSysDeptTreeDto>> treeAll() {
        List<ZhjdSysDeptTreeDto> list = zhjdSysDeptService.treeAll();
        return ResultUtils.ok(list);
    }

    /******************************** 组织结构功能 开始 **********************************/

    /**
     * @Title tree
     * @Description 获取机构树
     * @return 机构树
     */
    @GetMapping("/tree")
    public Result<List<ZhjdSysDeptTreeDto>> treeDept() {
        List<ZhjdSysDeptTreeDto> list = zhjdSysDeptService.treeDept();
        return ResultUtils.ok(list);
    }

    /**
     * @Title listByPid
     * @Description 根据父节点主键获取机构列表
     * @param pid 父节点主键
     * @return 机构列表
     */
    @GetMapping("/listByPid")
    public Result<List<ZhjdSysDeptEntity>> listDeptByPid(String pid) {
        List<ZhjdSysDeptEntity> list = zhjdSysDeptService.listDeptByPid(pid);
        return ResultUtils.ok(list);
    }

    /**
     * @Title find
     * @Description 获取机构数据
     * @param pkId 机构主键
     * @return 机构数据
     */
    @GetMapping("/find/{pkId}")
    public Result<ZhjdSysDeptEntity> findDept(@PathVariable("pkId") String pkId) {
        ZhjdSysDeptEntity data = zhjdSysDeptService.findDept(pkId);
        if (null == data) {
            return ResultUtils.error(BizCode.DATA_NOT_FOUND, "组织机构不存在");
        }
        return ResultUtils.ok(data);
    }

    /**
     * @Title save
     * @Description 添加机构信息
     * @param entity 机构信息
     * @return 添加结果
     */
    @PostMapping("/save")
    public Result<String> saveDept(@RequestBody ZhjdSysDeptEntity entity) {
        if (ZhjdSysDeptConstants.TYPE_BASE.equals(entity.getType())) {
            return ResultUtils.error(BizCode.PARAMS_ERROR, "养护基地不可在此添加");
        }
        ValidatorUtils.validateEntity(entity, AddGroup.class);
        zhjdSysDeptService.saveDept(entity);
        return ResultUtils.ok();
    }

    /**
     * @Title update
     * @Description 修改机构信息
     * @param entity 机构信息
     * @return 修改结果
     */
    @PostMapping("/update")
    public Result<String> updateDept(@RequestBody ZhjdSysDeptEntity entity) {
        if (ZhjdSysDeptConstants.TYPE_BASE.equals(entity.getType())) {
            return ResultUtils.error(BizCode.PARAMS_ERROR, "养护基地不可在此修改");
        }
        ValidatorUtils.validateEntity(entity, UpdateGroup.class);
        zhjdSysDeptService.updateDept(entity);
        return ResultUtils.ok();
    }

    /**
     * @Title sort
     * @Description 机构信息排序
     * @param pkId1 机构主键
     * @param pkId2 机构主键
     * @return 排序结果
     */
    @PostMapping("/sort")
    public Result<String> sortDept(String pkId1, String pkId2) {
        zhjdSysDeptService.sortDept(pkId1, pkId2);
        return ResultUtils.ok();
    }

    /**
     * @Title delete
     * @Description 删除机构信息
     * @param pkId 机构主键
     * @return 删除结果
     */
    @PostMapping("/delete/{pkId}")
    public Result<String> delete(@PathVariable("pkId") String pkId) {
        zhjdSysDeptService.deleteDept(pkId);
        return ResultUtils.ok();
    }

    /******************************** 组织结构功能 结束 **********************************/

    /******************************** 养护基地功能 开始 **********************************/

    /**
     * @Title pageForBase
     * @Description 获取养护基地分页列表
     * @param params 查询条件
     * @return 养护基地分页列表
     */
    @RequiresPermissions("sys:base:page")
    @GetMapping("/pageForBase")
    public Result<IPage<ZhjdSysDeptEntity>> pageForBase(@RequestParam Map<String, Object> params) {
        IPage<ZhjdSysDeptEntity> page = zhjdSysDeptService.pageForBase(params);
        return ResultUtils.ok(page);
    }

    /**
     * @Title listForBase
     * @Description 获取养护基地列表
     * @return 养护基地列表
     */
    @GetMapping("/listForBase")
    public Result<List<ZhjdSysDeptEntity>> listForBase() {
        List<ZhjdSysDeptEntity> list = zhjdSysDeptService.listForBase(new HashMap<String, Object>());
        return ResultUtils.ok(list);
    }

    /**
     * @Title find
     * @Description 获取机构数据
     * @param pkId 机构主键
     * @return 机构数据
     */
    @RequiresPermissions(value = {"sys:base:info", "sys:base:update"}, logical = Logical.OR)
    @GetMapping("/findBase/{pkId}")
    public Result<ZhjdSysDeptEntity> findBase(@PathVariable("pkId") String pkId) {
        ZhjdSysDeptEntity data = zhjdSysDeptService.findBase(pkId);
        if (null == data) {
            return ResultUtils.error(BizCode.DATA_NOT_FOUND, "养护基地不存在");
        }
        return ResultUtils.ok(data);
    }

    /**
     * @Title save
     * @Description 添加机构信息
     * @param entity 机构信息
     * @return 添加结果
     */
    @RequiresPermissions("sys:base:save")
    @PostMapping("/saveBase")
    public Result<String> saveBase(@RequestBody ZhjdSysDeptEntity entity) {
        entity.setType(ZhjdSysDeptConstants.TYPE_BASE);
        ValidatorUtils.validateEntity(entity, AddGroup.class, SysBaseAddGroup.class);
        zhjdSysDeptService.saveBase(entity);
        return ResultUtils.ok();
    }

    /**
     * @Title update
     * @Description 修改机构信息
     * @param entity 机构信息
     * @return 修改结果
     */
    @RequiresPermissions("sys:base:update")
    @PostMapping("/updateBase")
    public Result<String> updateBase(@RequestBody ZhjdSysDeptEntity entity) {
        entity.setType(ZhjdSysDeptConstants.TYPE_BASE);
        ValidatorUtils.validateEntity(entity, UpdateGroup.class, SysBaseUpdateGroup.class);
        zhjdSysDeptService.updateBase(entity);
        return ResultUtils.ok();
    }

    /**
     * @Title delete
     * @Description 删除机构信息
     * @param pkId 机构主键
     * @return 删除结果
     */
    @RequiresPermissions("sys:base:delete")
    @PostMapping("/deleteBase/{pkId}")
    public Result<String> deleteBase(@PathVariable("pkId") String pkId) {
        zhjdSysDeptService.deleteBase(pkId);
        return ResultUtils.ok();
    }

    /******************************** 养护基地功能 结束 **********************************/
}